package main.java.maziacs.characters;

import main.java.maziacs.Dice;


public class Battle {

	//El atributo pj indica el personaje que gana la batalla.
	ICharacter pj;
	Dice dice;

	public Battle(IHero hero, IMaziacs maziacs2){//TODO
		if(hero.equals(null) || maziacs2.equals(null))
			throw new IllegalArgumentException();
		dice=new Dice(6);
		this.hero=hero;
		this.maziacs= maziacs2;//TODO
		pj=fight();
	}
	
	public ICharacter getPj() {
		return pj;
	}

	public void setPj(Character pj) {
		if(pj.equals(null) || pj.equals(null))
			throw new IllegalArgumentException();
		this.pj = pj;
	}

			
	/*
	 *Genera una lucha entre el heroe y el maziac y devuelve el Personaje que ha ganado la batalla */
	public ICharacter fight(){
		ICharacter winner;
		Integer throwDice=dice.rollingDice();
		//Se comprueba si el heroe tiene o no espada
		if(getHero().hasSword()){
			//Si tiene espada gana la batalla automaticamente, pierde la espada y pierde la 
			//energia correspondiente. La energia perdida es la tirada del dado entre 2
			//redondeado hacia arriba
			winner=getHero();
			getHero().setSword(false);
			if(throwDice%2==0)
				getHero().setEnergy(getHero().getEnergy()-throwDice/2);
			else
				getHero().setEnergy(getHero().getEnergy()-(throwDice+1)/2);
		}
		else{
			//Si no tiene espada gana el heroe si en el dado saca un 5 o un 6 y eso es
			//lo que pierde de energia
			if(throwDice==5 || throwDice==6){
				winner=hero;
				getHero().setEnergy(getHero().getEnergy()-throwDice);
			}
			else{
				//Si no pierde el heroe y muere
				winner=maziacs;
				hero.setEnergy(0);
			}
			
		}
		/*Aun ganando el heroe, si al perder la energia baja de 0, muere
		 * Se indica a la clase partida que el heroe ha perdido y finaliza la partida*/
		if(hero.getEnergy()<=0){
			hero.getGame().setHeroWins(false);
			hero.getGame().setFinishGame(true);
		}
		return winner;
	}


		/**
		 * @uml.property  name="hero"
		 * @uml.associationEnd  multiplicity="(1 1)" inverse="battle:uml.Hero"
		 */
		private IHero hero;

		/**
		 * Getter of the property <tt>hero</tt>
		 * @return  Returns the hero.
		 * @uml.property  name="hero"
		 */
		public IHero getHero() {
			return hero;
		}

		/**
		 * Setter of the property <tt>hero</tt>
		 * @param hero  The hero to set.
		 * @uml.property  name="hero"
		 */
		public void setHero(Hero hero) {
			if(hero.equals(null))
			this.hero = hero;
		}


		/**
		 * @uml.property  name="maziacs"
		 * @uml.associationEnd  multiplicity="(1 1)" inverse="battle:uml.Maziacs"
		 */
		private IMaziacs maziacs;

		/**
		 * Getter of the property <tt>maziacs</tt>
		 * @return  Returns the maziacs.
		 * @uml.property  name="maziacs"
		 */
		public IMaziacs getMaziacs() {
			return maziacs;
		}

		/**
		 * Setter of the property <tt>maziacs</tt>
		 * @param maziacs  The maziacs to set.
		 * @uml.property  name="maziacs"
		 */
		public void setMaziacs(Maziacs maziacs) {
			if(maziacs.equals(null))
			this.maziacs = maziacs;
		}

}
